package ar.fiuba.fallar2.pac_man.controllers;

import java.awt.Point;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import ar.fiuba.fallar2.pac_man.AbstractPersonaje;
import ar.fiuba.fallar2.pac_man.arbolDecision.model.DecisionTree;
import ar.fiuba.fallar2.pac_man.arbolDecision.model.DecisionTree.BinTree;
import ar.fiuba.fallar2.pac_man.fantasma.model.Fantasma;
import ar.fiuba.fallar2.pac_man.pacman.Pacman;
import ar.fiuba.fallar2.pac_man.pregunta.model.Pregunta;
import ar.fiuba.fallar2.pac_man.utils.FabricaDeMapas;
import ar.fiuba.fallar2.pac_man.utils.Mapa;
import ar.fiuba.fallar2.pac_man.pregunta.persist.PreguntaDataMapper;

public class GameControlador {
	

   
	

    //fundamentalmente es controlador de los fantasmas y demas
    private static Mapa mapaJuego=null;
    public static DecisionTree arbolDecision=null;
    private static List listaFantasmas= null;
    private static Pacman pacman;
    private static boolean jugando;


  private static void init()
{ 
	if(mapaJuego==null)
	   {
		mapaJuego=FabricaDeMapas.obtenerMapa(0);  
	    listaFantasmas=mapaJuego.getFantasmas();
	    
	   }
	
	if(arbolDecision==null)
		{
		arbolDecision=new DecisionTree();
		PreguntaDataMapper preguntaMapper=new PreguntaDataMapper();
		List listaPreguntas= preguntaMapper.findAll();
		Iterator it=listaPreguntas.iterator();
		
		while(it.hasNext())
		{
			Pregunta preg=(Pregunta)it.next();
			if(preg.getSiNo()==-1)				arbolDecision.createRoot(preg.getId(),preg.getPreguntaSINO());
			else if(preg.getSiNo()==0)          arbolDecision.addYesNode(preg.getIdExistente(),preg.getId(),preg.getPreguntaSINO());
			else	                            arbolDecision.addNoNode(preg.getIdExistente(),preg.getId(),preg.getPreguntaSINO());
		}

		}
		
}

public static Mapa getMapaJuego() {
	return mapaJuego;
}

public static void setMapaJuego(Mapa mapaJuego) {
	GameControlador.mapaJuego = mapaJuego;
}

public static DecisionTree getArbolDecisionFantasmas() {
	return arbolDecision;
}

public static void setArbolDecisionFantasmas(DecisionTree arbolDecisionFantasmas) {
	GameControlador.arbolDecision = arbolDecisionFantasmas;
}

public static List getListaFantasmas() {
	return listaFantasmas;
}

public static void setListaFantasmas(List listaFantasmas) {
	GameControlador.listaFantasmas = listaFantasmas;
}

public static Pacman getPacman() {
	return pacman;
}

public static void setPacman(Pacman pacman) {
	GameControlador.pacman = pacman;
}



public GameControlador(Pacman pac) {
	super();
	init();
	pac.setMapa(GameControlador.mapaJuego);
	GameControlador.pacman=pac;
	GameControlador.jugando=true;
}
		

public void jugar(int movimientoPacman)
{

if(movimientoPacman==AbstractPersonaje.ABAJO)  
		pacman.moverAbajo();
else if (movimientoPacman==AbstractPersonaje.ARRIBA)
	    pacman.moverArriba();
else if (movimientoPacman==AbstractPersonaje.DERECHA)
	    pacman.moverDerecha();
else pacman.moverIzquierda();

pacman.checkDireccion();
if(pacman.moverseEnDireccionActual()<0)
       GameControlador.mapaJuego.restarPunto();

boolean pastilla=false;

if(pacman.getEstado()!=Pacman.VICTIMA) pastilla=true;
float porcentajePuntosComidos=1-(float)mapaJuego.getPuntosSinComer()/mapaJuego.getPuntajePremio();
boolean menor25porciento=false;
if(porcentajePuntosComidos < (float) 0.25) menor25porciento=true;
Iterator it=listaFantasmas.iterator();

while(it.hasNext())
{
					
					boolean menorDistancia=false;
					boolean mayorDistancia=false;
					boolean aleatorio=false;
	                BinTree binAux=arbolDecision.rootNode; 
	                Fantasma f=(Fantasma)it.next();
	                String color=f.getColor();
		            f.setMapa(GameControlador.mapaJuego);   
		            String pregunta;
		            while(!(pregunta=binAux.getQuestOrAns()).contains("accion:"))
	                { 
	                	
	                    System.out.println("pregunta: "+pregunta);
	                    if(pregunta.contains("color:"))
	                       {		
	                    	if(pregunta.contains(color))
	                    	{
	                         binAux=binAux.getYesBranch();
	                         System.out.println(" Si ");
	                         continue;
	                    	}
	                        else
	                        {
	                        binAux=binAux.getNoBranch();
	                        System.out.println(" No ");
	                        continue;
	                        }
	                      }	                  
	                    
	                  
	                    if(pregunta.contains("pacman:") && pregunta.contains("comio pastilla"))
                        {
                        if(pastilla) { binAux=binAux.getYesBranch();System.out.println(" Si"  ); }
                        else         { binAux=binAux.getNoBranch(); System.out.println(" No ");}
                        continue;
                        }
      
	                    if(pregunta.contains("puntos:") && pregunta.contains("< 25"))
	                    {
	                    	if(menor25porciento) 		{binAux=binAux.getYesBranch(); System.out.println(" Si ");}
	                        else  	    				{binAux=binAux.getNoBranch();  System.out.println(" No "); }
	                       continue;
	                    }	
	                    
	                  }
		            
	
                    System.out.println(pregunta);
                	
		            if(pregunta.contains("accion:"))
                	{ 
                	if(pregunta.contains("mayor distancia"))
                		mayorDistancia=true;
                	if(pregunta.contains("menor distancia"))
                		menorDistancia=true;
                	if(pregunta.contains("aleatorio"))
                		aleatorio=true;
                
                	}
    
    
	                int direcProxima;
	                if     (menorDistancia)
	                	direcProxima=f.direccionParaMinimaDistanciaA(GameControlador.getPacman());
	                else if(mayorDistancia) 
	                	direcProxima=f.direccionParaMaximaDistanciaA(GameControlador.pacman);
	                else 			        
	                	direcProxima=f.direccionAleatoria();
	                f.setDireccion(direcProxima);
	                f.moverseEnDireccionActual();
				}
pacman.checkFantasmaEnCelda();

}

static void printPosicionFantasmas(GameControlador gc)
{	

List l=gc.getListaFantasmas();
Iterator i=l.iterator();
while(i.hasNext())
{
	Fantasma f=(Fantasma)i.next();
    Point p=f.getUbicacion();
    System.out.println("posicion Fantasma "+f.getColor()+" p.x:"+p.x+","+"p.y:"+p.y);
}

}


static void printPosicionPacman(GameControlador gc)
{
Point p=gc.getPacman().getUbicacion();
System.out.println("posicion pacman p.x:"+p.x+","+"p.y:"+p.y);

}

public static void main(String[] args) throws IOException 

{   
	Pacman pac=new Pacman(new Point(10,12),25, AbstractPersonaje.DERECHA);
	GameControlador gc=new GameControlador(pac);
	printPosicionPacman(gc);
	printPosicionFantasmas(gc);
    gc.jugar(AbstractPersonaje.ARRIBA); 
	printPosicionPacman(gc);
	printPosicionFantasmas(gc);
	gc.jugar(AbstractPersonaje.IZQUIERDA); 
	printPosicionPacman(gc);
	printPosicionFantasmas(gc);
	gc.jugar(AbstractPersonaje.DERECHA); 
	printPosicionPacman(gc);
	printPosicionFantasmas(gc);
	gc.jugar(AbstractPersonaje.ABAJO); 
	printPosicionPacman(gc);
	printPosicionFantasmas(gc);
	gc.jugar(AbstractPersonaje.ARRIBA);
	printPosicionPacman(gc);
	printPosicionFantasmas(gc);
	gc.jugar(AbstractPersonaje.DERECHA);
	printPosicionPacman(gc);
	printPosicionFantasmas(gc);
	gc.jugar(AbstractPersonaje.IZQUIERDA);
	printPosicionPacman(gc);
	printPosicionFantasmas(gc);
	

}

}